精通Linux系列三十:基于命令行的数学与计算
点击关注公众号,AI&编程干货及时送达
数学与计算
命令 | 含义 |
expr | 在命令行上进行简单的数学计算。 |
bc | 基于文本的计算器。 |
dc | 基于文本的RPN计算器。 |
需要一个计算器吗? Linux提供了一些命令行程序来为你计算数学真理。
expr
stdin stdout -文件 --选项* --帮助 --版本
expr expression
expr
命令在命令行上执行简单的数学计算(和其他表达式评估):
→ expr 7 + 3
10
→ expr '(' 7 + 3 ')' '*' 14 Shell字符需要引号
140
→ expr length ABCDEFG
7
→ expr 15 '>' 16
0 意思是假
每个参数必须由空白字符分隔。注意我们必须引用或转义对shell有特殊意义的任何字符。可以使用(已转义的)括号进行分组。expr
的操作符包括:
操作符 | 数字操作 | 字符串操作 |
+, -, *, / | 分别为加法、减法、乘法和整数除法 | |
% | 余数(模) | |
< | 小于 | 在字典中较早 |
<= | 小于或等于 | 在字典中较早,或等于 |
> | 大于 | 在字典中较晚 |
>= | 大于或等于 | 在字典中较晚,或等于 |
= | 相等 | 相等 |
!= | 不等 | 不等 |
` | ` | 布尔“或” |
& | 布尔“与” | 布尔“与” |
s : regexp | 正则表达式*regexp 是否匹配字符串s *? | |
substr s p n | 打印字符串*s 的n 个字符,从位置p 开始(p * =1是第一个字符) | |
index s chars | 返回字符串*s 中包含来自字符串chars *的第一个字符的位置的索引。如果未找到,返回0。与C函数index() 行为相同。 |
对于布尔表达式,数字0和空字符串被视为假;任何其他值都被视为真。对于布尔结果,0是假,1是真。
bc
stdin stdout -文件 --选项* --帮助* --版本
bc [options] [files]
bc
是一个基于文本的计算器,它读取每行一个的算术表达式,并打印结果。与大多数其他计算器不同,bc
可以处理无限大小的数字和任意数量的小数位:
→ bc
1+2+3+4+5
15
scale=2
(1 + 2 * 3 / 4) - 5
-2.50
2^100
1267650600228229401496703205376
^D
程序员可能会喜欢切换基数来执行计算和转换,比如二进制、八进制、十六进制,甚至是自定义基数:
→ bc
obase=2 结果显示为2进制
999
---
1111100111obase=16 或者说是16进制
999
3E7
但是bc
不止于此。它还是一个可编程计算器,你可以在其中定义自己的函数。下面是一个函数,它实现了代数中的二次公式,并打印给定方程的实数根,存储在一个名为*quadratic.*的文件中:[22]
→ cat quadratic.
scale=2
define quadform ( a, b, c ) {
root1 = (-b + sqrt(b^2 - 4*a*c)) / (2*a)
root2 = (-b - sqrt(b^2 - 4*a*c)) / (2*a)
print root1, " ", root2, "\n"
}
quadform(1, 7, 12) 求解 x2 + 7x + 12 = 0
将文件重定向到bc
,然后查看结果:
→ bc < quadratic.
-3.00 -4.00
在最强大的形式中,bc
是一个算术编程语言。你可以为变量赋值、操作数组、执行条件表达式和循环,甚至可以编写提示用户输入值并执行任何你喜欢的数学操作的脚本。要查看完整的细节,请参阅手册页(manpage)。
有用的算术运算
+, -, *, / | 加法、减法、乘法和除法。除法的结果会截断到当前的刻度(见下文)。 |
% | 余数(模)。 |
^ | 幂运算,例如10^5 表示“10的五次方”。 |
sqrt(* N*) | *N *的平方根。 |
ibase=* N* | 将所有输入数字视为基数*N *。 |
obase=* N* | 以基数*N *输出所有数字。 |
scale=* N* | 将小数点后的有效数字位数设置为*N *。 |
( ... ) | 用于分组(改变优先级)的括号。 |
* name*=* value* | 将值分配给变量*name *。 |
dc
stdin stdout - file -- opt --help --version
dc [options] [files]
dc
(desk calculator)命令是一个逆波兰记法(RPN)、基于堆栈的计算器,从标准输入读取表达式并将结果写入标准输出。如果你知道如何使用惠普逆波兰记法计算器,那么一旦你理解了它的语法,使用dc
就相对容易了。但如果你习惯于传统的计算器,dc
可能会显得难以理解。我们只会介绍一些基本命令。
对于堆栈和计算器操作:
q | 退出dc 。 |
f | 打印整个堆栈。 |
c | 删除(清除)整个堆栈。 |
p | 打印堆栈顶部的值。 |
P | 弹出(移除)堆栈顶部的值。 |
n k | 将未来操作的精度设置为*n *小数位(默认为0,表示整数操作)。 |
要弹出堆栈的顶部两个值,执行请求的操作,并推送结果:
+, -, *, / | 加法、减法、乘法和除法。 |
% | 余数(模)。 |
^ | 幂运算(第二顶部的值为底数,顶部的值为指数)。 |
要从堆栈顶部弹出值,执行请求的操作,并推送结果:
v | 平方根。 |
示例:
→ dc
4 5 + p 打印4和5的和
9
2 3 ^ p 将2的3次方并打印结果
8
10 * p 乘以堆栈顶部的10并打印结果
80
f 打印堆栈
80
9
+p 弹出顶部的两个值并打印它们的和
89
推荐阅读
你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。